package com.itools.core.service;

import com.itools.core.base.CommonResult;
import com.itools.core.param.FmsAccessTokenParam;
import com.itools.core.param.FmsUploadTokenParam;
import com.itools.core.param.FmsBusinessTypeParam;
import com.itools.core.request.FmsBase64FileUploadRequest;
import com.itools.core.result.FmsBusinessTypeResult;
import com.itools.core.result.FmsDetailRecordResult;
import com.itools.core.result.FmsFileRecordPathResult;
import com.itools.core.result.FmsMultipartFileResult;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @project: itools-backend
 * @description:
 * @author: XUCHANG
 * @create: 2021-04-01 11:26
 */
public interface FmsFileSystemService {

    /**
     * 根据uniqeId和文件名得到本地文件存储路径
     * @param uniqueId
     * @param fileName
     * @return
     */
    String getFileLocalPath(String uniqueId, String fileName);

    

    /**
     * 存储文件
     *
     * @param file
     * @param fmsUploadTokenParam
     * @return
     */
    String saveFile(MultipartFile file, FmsUploadTokenParam fmsUploadTokenParam);


    
    /**
     * 申请文件上传token
     * @param businessType
     * @param fromSystemId
     * @param needEncrypt
     * @param remark
     * @return
     */
    CommonResult<String> applyUploadToken(String businessType, String fromSystemId, String needEncrypt, String remark);
    
    
    /**
     * 存储文件
     * 使用字节流输入文件
     * 返回文件的全局唯一ID
     * @param fileBytes
     * @param fileName
     * @param fsBusinessType
     * @param fsUploadToken
     * @return
     */
    String saveFileFromBytes(byte[] fileBytes, String fileName, FmsBusinessTypeParam fsBusinessType, FmsUploadTokenParam fsUploadToken);




    /**
     * 获取文件访问路径,如果超时时间设置为小于等于0，那么返回的有效路径可以永久访问
     *
     * @param uniqueId
     * @param expiredTime
     * @param maxAccessCount
     * @param type
     * @return
     */
    CommonResult<String> getFileUrlByFileId(String uniqueId, int expiredTime, int maxAccessCount, String type);

    /**
     * 获得uniqueId对应的文件上传记录
     * 会检查
     * @param fmsAccessTokenParam
     * @param uniqueId
     * @param fileAccessToken
     * @return
     */
    FmsDetailRecordResult getFileUploadRecord(FmsAccessTokenParam fmsAccessTokenParam, String uniqueId, String fileAccessToken);


    /**
     * 获得uniqueId对应的文件上传记录
     * @param uniqueId
     * @return
     */
    FmsDetailRecordResult getFileUploadRecord(String uniqueId);

    /**
     * 根据文件唯一id查询文件的上传记录
     * @param uniqueIds 文件唯一id
     * @return
     */
    List<FmsDetailRecordResult> queryFileRecordsByUniqueIds(List<String> uniqueIds);

    /**
     * 文件批量上传
     * @param files
     * @param fmsUploadTokenParam
     * @return
     */
    CommonResult<List<FmsMultipartFileResult>> uploadFiles(MultipartFile[] files, FmsUploadTokenParam fmsUploadTokenParam);

    /**
     * 验证文件
     * @param files
     * @param fsBusinessType
     */
    void verifyFiles(MultipartFile[] files, FmsBusinessTypeResult fsBusinessType);
    /**
     * 验证文件
     * @param file
     * @param fsBusinessType
     */
    void verifyFiles(MultipartFile file, FmsBusinessTypeResult fsBusinessType);

    /**
     * 获取文件访问路径,如果超时时间设置为小于等于0，那么返回的有效路径可以永久访问
     * @param uniqueIds
     * @param expiredTime
     * @param maxAccessCount
     * @param type
     * @return
     */
    CommonResult<List<FmsFileRecordPathResult>> getFileUrlByFileIds(List<String> uniqueIds, Integer expiredTime, int maxAccessCount, String type);

    /**
     * 下载文件
     * @param fileAccessToken
     * @param response
     * @param uniqueId
     */
    void downloadFile(String fileAccessToken, HttpServletResponse response, String uniqueId);

    /**
     * 获取base64文件
     * @param uniqueId
     * @return
     */
    CommonResult<String> getFileBase64(String uniqueId);

    /**
     * 上传base64文件
     * @param base64Req
     * @return
     */
    CommonResult<String> uploadFileBase64(FmsBase64FileUploadRequest base64Req);

    /**
     * 下载zip压缩文件接口
     * @param uniqueIds
     * @param zipName
     * @param response
     */
    void downloadZipByUniqueIds(List<String> uniqueIds, String zipName, HttpServletResponse response);
    /**
     * 文件持久化到数据库
     * @param file
     * @param fmsUploadTokenParam
     * @param uuid
     * @return
     */
    String createAndPersistDBRecord(MultipartFile file, FmsUploadTokenParam fmsUploadTokenParam, String uuid);
}
